import os
from time import sleep
import pandas as pd
from config import file_url_config, gygx_config, gylz_config, liuyao_config, shangyao_config, query_params_config
from logs.set_logfile import logger
from config.file_url_config import total_excel_name
from openpyxl.utils import get_column_letter
from config.excel_config import column_widths, total_excel_column_types
from h3yun.service import site_data_service, medical_goods_servce, goods_service
from config import shanlian_config, jinbo_config
from clean_data.common.common import mate_medical_goods,  make_list_to_dict, get_site_dict


# TODO 现在是先合并过来 然后大家一起去匹配产品编码和医院编码等
# 合并今天的文件夹目录下面的excel表格数据
# 然后补充一下这个医院编码
def merge_excel_a_day():
    # 设置文件夹路径
    folder_path = file_url_config.download_excel_file_url

    # 初始化一个空的 DataFrame 用于存储合并后的数据
    merged_df = pd.DataFrame()

    # 遍历文件夹下所有 Excel 文件
    for filename in os.listdir(folder_path):
        if filename.endswith('.xlsx') and total_excel_name != filename:
            # 构建完整的文件路径
            file_path = os.path.join(folder_path, filename)

            # 读取 Excel 文件到 DataFrame
            df = pd.read_excel(file_path, dtype=total_excel_column_types)

            # 将当前 DataFrame 追加到合并后的 DataFrame
            merged_df = merged_df._append(df, ignore_index=True)

    # 1.匹配站点
    match_site(merged_df)
    # 2. 匹配产品编码
    match_goods(merged_df)
    # 3. 匹配单价生产厂家(柳药没有生产厂家)
    mate_medical_goods(merged_df, {
        '生产厂家': 'F0000023',
        '单价': 'F0000045'
    })
    # 4. 然后去匹配变更表
    mate_medical_goods(merged_df, {
        '单价': 'F0000008'
    })

    # 5. 去除高值的数据只要试剂
    merged_df = remove_high_value_data(merged_df)

    # 6.去除掉血气
    condition = ((merged_df['产品名称(公司内部的)'] == '血气测定试剂盒（电极法）Measurement Cartridge')
                 & (merged_df['配送商'] == '国药控股广西有限公司')
                 & (merged_df['数据来源'] == gygx_config.data_source))
    merged_df = merged_df[~condition]
    condition = ((merged_df['产品名称(公司内部的)'] == '血气测定试剂盒（电极法）Measurement Cartridge')
                 & (merged_df['配送商'] == '众志飞救医疗科技（深圳）有限公司')
                 & (merged_df['数据来源'] == shanlian_config.data_source))
    merged_df = merged_df[~condition]

    # 7. 删除金博里面 国药广西柳州 柳药的数据
    condition = ((merged_df['医院名称(公司内部的)'] == '国药控股广西有限公司')
                 & (merged_df['数据来源'] == jinbo_config.data_source))
    merged_df = merged_df[~condition]
    condition = ((merged_df['医院名称(公司内部的)'] == '国药控股柳州有限公司')
                 & (merged_df['数据来源'] == jinbo_config.data_source))
    merged_df = merged_df[~condition]
    condition = ((merged_df['医院名称(公司内部的)'] == '广西柳药集团股份有限公司')
                 & (merged_df['数据来源'] == jinbo_config.data_source))
    merged_df = merged_df[~condition]

    # 需要检查的列（排除掉"异常信息"列）
    check_cols = [col for col in merged_df.columns if col != '异常信息']

    # 检查每一行
    def set_exception_info(row):
        if row[check_cols].notna().all():
            return row['异常信息']  # 保持原来的异常信息（不覆盖）
        else:
            return '产品编码或则站点编码匹配失败'  # 你要填进去的内容，比如写"正常"、"通过"、"无异常"之类的

    # 应用到 DataFrame
    merged_df['异常信息'] = merged_df.apply(set_exception_info, axis=1)

    # 保存合并后的数据到新的 Excel 文件
    merged_df.to_excel(file_url_config.download_one_day_total_excel_file_url, index=False)
    print(f'汇总一天的文件路径{file_url_config.download_one_day_total_excel_file_url}')

    sleep(5)
    # 打开合并后的 Excel 文件并调整列宽度
    adjust_column_width(merged_df, file_url_config.download_one_day_total_excel_file_url)


# 合并到主表上面
def merge_total_excel():
    id_prefix = [liuyao_config.id_prefix,
                 gygx_config.id_prefix,
                 gylz_config.id_prefix,
                 liuyao_config.id_prefix,
                 jinbo_config.id_prefix,
                 shangyao_config.id_prefix]

    for i in range(len(id_prefix)):
        id_prefix[i] = id_prefix[i] + '_' + query_params_config.nowDay

    # 读取表格 A
    df_a = pd.read_excel(file_url_config.download_total_excel_all_file_url, dtype=total_excel_column_types)

    # 如果第二次运行可能会有重复的数据 先把今天已经汇总的数据都删除 然后再重新放进去
    condition = df_a['ID'].apply(lambda x: any(prefix in x for prefix in id_prefix))
    df_a = df_a[~condition]

    # 读取表格 B
    df_b = pd.read_excel(file_url_config.download_one_day_total_excel_file_url, dtype=total_excel_column_types)

    # 追加 B 到 A 后面
    merged_df = pd.concat([df_a, df_b], ignore_index=True)

    # 根据id去重（双保险，其实前面对A表已经完成去重了）
    merged_df = merged_df.drop_duplicates(subset='ID', keep='first')

    # 保存合并后的数据到原 Excel A 文件，覆盖原文件
    merged_df.to_excel(file_url_config.download_total_excel_all_file_url, index=False)  # 替换为实际的 Excel A 文件路径

    # print('合并后的数据已保存到新的 Excel 文件。')
    logger.info("合并到总表上成功！")


# 合并任意两个excel表格 A B B是A的子表
# 这个方法没有测试过 需要测试
def merge_two_excel(excel_a_url, excel_b_url):
    # 读取表格 A
    df_a = pd.read_excel(excel_a_url)

    # 读取表格 B
    df_b = pd.read_excel(excel_b_url)

    # 追加 B 到 A 后面
    merged_df = pd.concat([df_a, df_b], ignore_index=True)

    # 保存合并后的数据到原 Excel A 文件，覆盖原文件
    merged_df.to_excel(file_url_config.download_total_excel_all_file_url, index=False)  # 替换为实际的 Excel A 文件路径

    # print('合并后的数据已保存到新的 Excel 文件。')
    logger.info("合并到总表上成功！")


# 没有传的话 默认是日向数据汇总表的数据
def adjust_column_width(df, file_url, column_width=column_widths):
    with pd.ExcelWriter(file_url, engine='openpyxl') as writer:
        df.to_excel(writer, index=False, sheet_name='Sheet1')

        # 获取ExcelWriter对象的workbook和worksheet
        workbook = writer.book
        worksheet = writer.sheets['Sheet1']

        # 指定某一列的宽度，可以根据实际情况调整
        # column_widths = {
        #     '出库时间': 15,
        #     '配送商': 30,
        #     '配送商备案产品': 80,
        #     '生产厂家': 30,
        #     '医院名称': 30,
        #     '数量': 10,
        #     '单价': 15,
        #     '批次信息': 20,
        #     # 继续添加其他列...
        # }

        for column, width in column_width.items():
            column_index = df.columns.get_loc(column) + 1  # 获取列索引
            column_letter = get_column_letter(column_index)  # 将列索引转换为字母
            worksheet.column_dimensions[column_letter].width = width

    print(f'已保存Excel文件，并调整了列宽度。')


# F0000001 配送商名称
# F0000004 客户编码（配送商的）
# F0000005 医院编码（公司内部的）
# F0000006 医院名称（公司内部的）
# F0000002 产品编码（配送商的）
# F0000003 产品编码（公司内部的）
# F0000008 产品名称（公司内部的）
def get_goods_or_site_mate_dict(dict_type):
    goods_or_site_list = site_data_service.find_old_pss_flow_mate_data()
    # goods_or_site_list = filter(lambda x: x.get("F0000001") == pss_name, goods_or_site_list)

    goods_or_site_dict = {}
    dict_key = 'F0000004' if dict_type == "客户编码" else 'F0000002'

    for goods_or_site in goods_or_site_list:
        goods_or_site_dict[goods_or_site[dict_key]] = goods_or_site

    return goods_or_site_dict


# 匹配站点
# F0000001 配送商名称
# F0000002 配送商站点编码
# F0000003 医院名称
# F0000004 医院编码（公司备案）
# F0000005 医院编码（配送商备案）
def match_site(df):
    site_list = site_data_service.find_pss_site_mate_data()
    site_dict = {}
    for site in site_list:
        site_dict[str(site['F0000005'])] = {
            'YYBM_GSNB': site['F0000004'],
            'YYMC_GSNB': site['F0000003']
        }
    for index in range(len(df['客户编码(配送商的)'])):
        if df['数据来源'][index] == jinbo_config.data_source or df['数据来源'][index] == shanlian_config.data_source:
            continue
        k = df['客户编码(配送商的)'][index]
        df.loc[index, '医院编码(公司内部的)'] = site_dict.get(str(k).strip(), {}).get('YYBM_GSNB', '')
        df.loc[index, '医院名称(公司内部的)'] = site_dict.get(str(k).strip(), {}).get('YYMC_GSNB', '')


# 广西柳药集团股份有限公司 站点编码 02093001
# 国药控股柳州有限公司 站点编码 02093002
# 国药控股广西有限公司 站点编码 02023001
# 深圳闪链医疗供应链管理有限公司 站点编码 010131001
# 众志飞救医疗科技（深圳）有限公司 站点编码 01010001
#
# --- 医疗器械销售信息备案表 ---
# F0000049 备案销售客户/医院名称编码
# F0000051 销售终端医院编码
# D117400Fnczoagqa7nmbvn0erffeps704.F0000026 产品编码
# D117400Fnczoagqa7nmbvn0erffeps704.F0000023 生产厂家名称
# D117400Fnczoagqa7nmbvn0erffeps704.F0000045 终端医院供货价
# D117400Fnczoagqa7nmbvn0erffeps704.F0000006 产品名称
# D117400Fnczoagqa7nmbvn0erffeps704.F0000064 配送商平台产品编码
# -- 配送商产品编码备案 --
# F0000001 配送商名称
#
# --- 旧-配送商流向信息匹配基础表 ---
# F0000001 配送商名称
# F0000002 产品编码（配送商的）
# F0000005 医院编码（公司内部的）
# F0000008 产品名称（公司内部的）
# F0000003 产品编码（公司内部的）
# F0000005 产品编码（配送商备案）
# F0000003 产品名称
# F0000004 产品编码（公司备案）
#
# --- 变更-医疗器械销售信息备案 ---
#
def match_goods(df):
    # 1. 先匹配 医疗器械销售信息备案
    medical_goods_list = medical_goods_servce.find_medical_goods_data()
    site_dict = get_site_dict()
    for index in range(len(df['产品编码(配送商的)'])):
        # if df['数据来源'][index] == jinbo_config.data_source or df['数据来源'][index] == shanlian_config.data_source:
        #
        #     continue
        site_code = site_dict.get(df['配送商'][index], 0)
        for medical_goods in medical_goods_list:
            if medical_goods['Status'] != 1:
                continue
            # print(df['医院编码(公司内部的)'][index])
            if ((medical_goods['F0000049'] == site_code or medical_goods['F0000051'] == medical_goods['F0000049'])
                    and medical_goods['F0000051'] == df['医院编码(公司内部的)'][index]):
                goods_list = medical_goods['D117400Fnczoagqa7nmbvn0erffeps704']
                goods_dict = make_list_to_dict(goods_list, 'F0000064')
                goods = goods_dict.get(df['产品编码(配送商的)'][index], None)

                if goods is not None:
                    df.loc[index, '产品名称(公司内部的)'] = goods['F0000006']
                    df.loc[index, '产品编码(公司内部的)'] = goods['F0000026']
                    df.loc[index, '生产厂家'] = goods['F0000023']
                    # df.loc[index, '单价'] = goods['F0000045']
                    break

    # 2.在匹配 配送商产品编码备案 表
    # pss_goods_list = goods_service.find_pss_goods_mate_data()
    # for index in range(len(df['产品编码(配送商的)'])):
    #     if df['数据来源'][index] == jinbo_config.data_source or df['数据来源'][index] == shanlian_config:
    #         continue
    #     if not pd.isna(df['产品编码(公司内部的)'][index]):
    #         continue
    #     for pss_goods in pss_goods_list:
    #         if pss_goods['F0000001'] == df['配送商'][index] and pss_goods['F0000005'] == df['产品编码(配送商的)'][index]:
    #             df.loc[index, '产品名称(公司内部的)'] = pss_goods['F0000003']
    #             df.loc[index, '产品编码(公司内部的)'] = pss_goods['F0000004']
    #             break

    # 3.在匹配 旧-配送商流向信息匹配基础 表
    old_pss_flow_mate_list = site_data_service.find_old_pss_flow_mate_data()
    for index in range(len(df['产品编码(配送商的)'])):
        if df['数据来源'][index] == jinbo_config.data_source or df['数据来源'][index] == shanlian_config.data_source:
            continue
        if not pd.isna(df['产品编码(公司内部的)'][index]):
            continue
        for old_pss_flow in old_pss_flow_mate_list:
            if old_pss_flow['F0000001'] == df['配送商'][index] and old_pss_flow['F0000005'] == df['医院编码(公司内部的)'][index] and old_pss_flow['F0000002'] == df['产品编码(配送商的)'][index]:
                df.loc[index, '产品名称(公司内部的)'] = old_pss_flow['F0000008']
                df.loc[index, '产品编码(公司内部的)'] = old_pss_flow['F0000003']
                break


# F0000040 产品一级名称
# F0000010 注册证名字
def remove_high_value_data(df):
    goods_list = goods_service.find_medical_device_product_information_data()
    goods_list = filter(lambda goods: goods.get('F0000040') != '试剂', goods_list)
    goods_name_list = [goods.get('F0000010', '') for goods in goods_list if goods.get('F0000010')]

    def is_substring_of_any_goods_name(product_name):
        if not isinstance(product_name, str) or not product_name.strip():
            return False
        return any(product_name in goods_name for goods_name in goods_name_list if isinstance(goods_name, str))

    # 去掉匹配成功的（产品名称被包含在某个注册证名字中的）
    if '产品名称(配送商的)' in df.columns and not df.empty:
        df = df[~df['产品名称(配送商的)'].apply(is_substring_of_any_goods_name)]

    df = df[
        df['产品编码(公司内部的)'].isna() | df['产品编码(公司内部的)'].astype(str).str.match(r'^01\d{5}$')
        ]
  
    return df


if __name__ == '__main__':
    merge_excel_a_day()
    # old_pss_flow_mate_list = site_data_service.find_old_pss_flow_mate_data()
    # print(old_pss_flow_mate_list[0])
    # get_site_record_table_id_dict()

    # file_url = f'{file_url_config.cwd}\\补充数据.xlsx'
    # df = pd.read_excel(file_url)
    # site_dict = get_site_dict()
    # yymc_code = []
    # for yymc in df['F0000005']:
    #     if yymc in site_dict:
    #         yymc_code.append(site_dict[yymc])
    #     else:
    #         yymc_code.append('')
    # df['F0000016'] = yymc_code
    # df.to_excel(f'{file_url_config.cwd}\\补充数据2.xlsx', index=False)
